columnview: Revise scroll-minimum handling
authorMatthias Clasen <mclasen@redhat.com>
Tue, 17 Dec 2019 00:22:03 +0000 (19:22 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Wed, 3 Jun 2020 16:48:20 +0000 (12:48 -0400)
Tweak the behavior slightly. We don't show
a scrollbar as long as we have at least
min-size available, but we still give the
entire size to the child, up to nat-size.

This matches how viewports handle scroll-minimum.

gtk/gtkcolumnview.c

index e94875ae7130cd327ad462740b6dd414e83f2871..2f62aec830df5cc317ace9f07ac48c720fa9e75e 100644 (file)
@@ -34,6 +34,7 @@
 #include "gtkprivate.h"
 #include "gtkscrollable.h"
 #include "gtkwidgetprivate.h"
+#include "gtksizerequest.h"
 
 /**
  * SECTION:gtkcolumnview
@@ -171,46 +172,53 @@ gtk_column_view_allocate_columns (GtkColumnView *self,
   GtkScrollablePolicy scroll_policy;
   int col_min, col_nat, widget_min, widget_nat, extra, col_size, x;
   guint i;
+  int n;
+  GtkRequestedSize *sizes;
+
+  n = g_list_model_get_n_items (G_LIST_MODEL (self->columns));
+  sizes = g_newa (GtkRequestedSize, n);
+  for (i = 0; i < n; i++)
+    {
+      GtkColumnViewColumn *column;
+
+      column = g_list_model_get_item (G_LIST_MODEL (self->columns), i);
+      if (gtk_column_view_column_get_visible (column))
+        gtk_column_view_column_measure (column, &sizes[i].minimum_size, &sizes[i].natural_size);
+      else
+        sizes[i].minimum_size = sizes[i].natural_size = 0;
+      g_object_unref (column);
+    }
 
   gtk_column_view_measure_across (self, &col_min, &col_nat);
-  gtk_widget_measure (GTK_WIDGET (self),
-                      GTK_ORIENTATION_HORIZONTAL, -1,
-                      &widget_min, &widget_nat,
-                      NULL, NULL);
 
   scroll_policy = gtk_scrollable_get_hscroll_policy (GTK_SCROLLABLE (self->listview));
   if (scroll_policy == GTK_SCROLL_MINIMUM)
     {
-      extra = widget_min - col_min;
-      col_size = col_min;
+      extra = MAX (width - col_min, 0);
+      gtk_distribute_natural_allocation (extra, n, sizes);
     }
-  else
-    {
-      extra = widget_nat - col_nat;
-      col_size = col_nat;
-    }
-  width -= extra;
-  width = MAX (width, col_size);
 
   x = 0;
-  for (i = 0; i < g_list_model_get_n_items (G_LIST_MODEL (self->columns)); i++)
+  for (i = 0; i < n; i++)
     {
       GtkColumnViewColumn *column;
 
       column = g_list_model_get_item (G_LIST_MODEL (self->columns), i);
-      gtk_column_view_column_measure (column, &col_min, &col_nat);
-      if (scroll_policy == GTK_SCROLL_MINIMUM)
-        col_size = col_min;
-      else
-        col_size = col_nat;
+      if (gtk_column_view_column_get_visible (column))
+        {
+          if (scroll_policy == GTK_SCROLL_MINIMUM)
+            col_size = sizes[i].minimum_size;
+          else
+            col_size = sizes[i].natural_size;
 
-      gtk_column_view_column_allocate (column, x, col_size);
-      x += col_size;
+          gtk_column_view_column_allocate (column, x, col_size);
+          x += col_size;
+        }
 
       g_object_unref (column);
     }
 
-  return width + extra;
+  return x;
 }
 
 static void